今天來模擬一下後端的工作
複習一下前幾天講到的流程,後端的主要工作是:
當前端向第三方服務驗證取得 token 後,我讓網頁直接 show 出 token
public function callback()
{
$lineUser = Socialite::driver('line')->stateless()->user();
return $lineUser->actoken;
}
傳 token 這部分因為實務上在前端處理,這裡待會就手動複製、用 postman 模擬前端打後端的情形
我建立一支 API 讓前端 call 後端,傳送 token 過來使用
Route::prefix('/auth')->group(function () {
Route::post('/tokenValidation', [ThirdPartyAuthController::class, 'tokenValidation']);
});
public function tokenValidation(Request $request)
{
try {
$user = Socialite::driver('line')
->stateless()
//此次驗證請求不需使用 Session,使請求更輕量化
->userFromToken($request->input('access_token'));
// 用前端傳過來(第三方傳給User)的 token,重新向第三方服務驗證此Token是否正確,並取得user資料
} catch (\Throwable $exception) { //Throwable可同時捕捉到 exception 和 error
logger()->error('取得第三方使用者失敗', ['exception' => $exception]);
// 可以用 terminal 指令 tail -f storage/logs/laravel.log 查閱
abort(Response::HTTP_UNAUTHORIZED);
}
User::updateOrCreate([
'email' => $user->email,
],[
'line_id' => $user->id,
'name' => $user->name,
'image_path' => $user->avatar,
'email_verified_at' => now(),
]);
return '第三方驗證成功';
}
把 token 放入表單裡面,用 post 方法打向我剛剛設定的 api,成功取得資料啦
不過當我在驗證 token ,不知道為什麼用驗證token取得的資料無法取得使用者email,導致我在傳入後端資料庫建立或驗證使用者資料時會有問題(因為我用 email 當作 primary key,所以一定要有 email )
這個問題我自己認為應該是 Laravel Socialite 套件與 Line login 沒有完全相容導致,
private function respondWithToken(User $user)
{
$guard = Auth::guard('api');
$tokenLife = 60 * 24 * 365; //unit:minute (for one year)
$token = $guard->setTTL($tokenLife)->login($user);
return \response()->json([
'data' => [
'access_token' => $token,
'expires_in' => $tokenLife * 60,
'has_verified_email' => $user->hasVerifiedEmail(),
'token_type' => 'bearer',
],
]);
}